'use strict'

const Service = require('egg').Service

class AdminService extends Service {


    /**
     * 查询接口service
     * @param offset
     * @param limit
     * @param search
     * @param isPage
     * @returns {Promise<*>}
     */
    async index(offset = 0,limit = 10,search = '%%',forbidden = '',isPage = 'true'){
        const {app,ctx,service} = this;
        //sequelize的复杂运算符参数
        const Op = app.Sequelize.Op;
        //定义查询参数
        let param = {
            where:{
                [Op.or]:[
                    {
                        realname:{
                            [Op.like]:`%${search}%`
                        }
                    },
                    {
                        username:{
                            [Op.like]:`%${search}%`
                        }
                    },
                    {
                        phone:{
                            [Op.like]:`%${search}%`
                        }
                    }
                ],
                forbidden:{
                    [Op.in]:forbidden
                },
                deleted:'0',
                role_id:'b56fe8e0-3bf4-11e9-910f-bd5691940110'
            },
            order:[['forbidden','asc'],['created_at','desc']]
        };
        //判断是否分页
        if(isPage == 'true'){
            param.offset = offset;
            param.limit = limit;
        }else{
            let redis_data = await app.sessionStore.get('admin_list');
            if(!app.lodash.isEmpty(redis_data)){
                return redis_data;
            }
        }

        //调用sequelize查询数据库
        let data = await ctx.model.FdUser.findAndCountAll(param);

         //redis缓存
        //判断是否分页
        if(isPage != 'true'){
            await app.sessionStore.set('admin_list',data);
        }

        //返回结果
        return data;
    }

    /**
     * 新建接口service
     * @param param
     * @returns {Promise<*>}
     */
    async create(param){
        const {app,ctx,service} = this;
        //引入uuid生成器
        var uuid = require('node-uuid');

        //开启事务
        let t = await ctx.model.transaction();
        try {
            //定义新增的对象
            param.id = uuid.v1();
            param.deleted = '0';
            param.type = '0';
            param.forbidden = '0';
            //调用sequelize新增对象 findOrCreate 将返回一个数组[对象，新增成功与否的布尔] 如果新增对象已存在，则返回该对象和false 否则返回新增对象和true
            let rs = await ctx.model.FdUser.findOrCreate({where:{username:param.username,deleted:'0'},defaults:param,transaction:t});

            //提交事务
            t.commit();

            //清空此模块的redis缓存
            app.sessionStore.destroy('admin_list');

            //新增此对象的redis缓存
            app.sessionStore.set('admin_'+param.id,rs[0]);

            //返回新增结果
            return rs[1];

        }catch (e) {
            //若出错 回滚
            t.rollback();
            //抛出出错信息
            ctx.throw(500,e.message)
        }
    }

    /**
     * 删除接口service
     * @param param
     * @returns {Promise<boolean>}
     */
    async destroy(param){
        const {app,ctx,service} = this;
        //开启事务
        let t = await ctx.model.transaction();
        try {
            //更新要删除对象的deleted字段为1 采取逻辑删除
            let rs = await ctx.model.FdUser.update({deleted:'1'},{where:{id:param.id},transaction:t});
            //rs返回影响的数据行数

            //提交事务
            t.commit();

            //清空此模块的redis缓存
            app.sessionStore.destroy('admin_list');

            //删除此id的redis缓存
            app.sessionStore.destroy('admin_'+param.id);

            //判断删除结果 若成功，则为1
            if(rs[0] === 1){
                return true;
            }else{
                return false;
            }

        }catch (e) {
            //失败 回滚
            t.rollback();
            //抛出错误信息
            ctx.throw(500,e.message)
        }
    }

    /**
     * 单一数据查询接口service
     * @param param
     * @returns {Promise<*>}
     */
    async show(param){
        const {app,ctx,service} = this;

        let redis_admin = await app.sessionStore.get('admin_'+param.id);
        if(!app.lodash.isEmpty(redis_admin)){
            return redis_admin;
        }

        //调用sequelize查询 findOne 只返回查询接口的第一个
        let rs = await ctx.model.FdUser.findOne({where:{id:param.id,deleted:'0'}});

        await app.sessionStore.set('admin_'+param.id,rs);

        return rs;
    }

    /**
     * 更新接口service
     * @param param
     * @returns {Promise<boolean>}
     */
    async update(param){
        const {app,ctx,service} = this;
        //开启事务
        let t = await ctx.model.transaction();
        try {
            //调用sequelize update更新为批量更新 只要满足where条件的数据都将被更新
            let rs = await ctx.model.FdUser.update(param,{where:{id:param.id},transaction:t});
            //rs返回影响的数据行数

            //提交事务
            t.commit();

            //清空此模块的redis缓存
            app.sessionStore.destroy('admin_list');

            //删除此id的redis缓存
            app.sessionStore.destroy('admin_'+param.id);

            //判断结果
            if(rs[0] === 1){
                return true;
            }else{
                return false;
            }

        }catch (e) {
            //失败回滚
            t.rollback();
            //抛出错误信息
            ctx.throw(500,e.message)
        }
    }

    /**
     * 编辑service
     * @param param
     * @returns {Promise<void>}
     */
    async edit(param){
        const {app,ctx,service} = this;
        //开启事务
        let t = await ctx.model.transaction();
        try {
            //调用sequelize update更新为批量更新 只要满足where条件的数据都将被更新
            let rs = await ctx.model.FdUser.update(param,{where:{id:param.id},transaction:t});
            //rs返回影响的数据行数

            //提交事务
            t.commit();

            //清空此模块的redis缓存
            app.sessionStore.destroy('admin_list');

            //删除此id的redis缓存
            app.sessionStore.destroy('admin_'+param.id);

            //判断结果
            if(rs[0] === 1){
                return true;
            }else{
                return false;
            }

        }catch (e) {
            //失败回滚
            t.rollback();
            //抛出错误信息
            ctx.throw(500,e.message)
        }
    }
}

module.exports = AdminService;
